class Solution {
public:
    vector<vector<int>> ret;
    vector<int> path;//记录某一次dfs递归的路径结果
    void dfs(vector<int>& nums,int index)
    {
        if(index>=nums.size())
        {
            return;
        }//整个数组都已经遍历完毕了
        path.push_back(nums[index]);
       
        ret.push_back(path);//储存答案
        for(int i = index+1;i<nums.size();i++)
        {
            //遍历后面的数字去使用不同的数字，因为整个数组中的数字都是不同的值，所以这里直接从这个位置+1的位置开始
            //去填第二个位置即可
            dfs(nums,i);
        }
        //恢复现场
        path.pop_back();
       
    }//dfs的目的就是将某个位置填入index这个值，然后去递归下一个位置，最后返回的时候不要忘了将这一个位置填入的值删除，用于恢复现场
    vector<vector<int>> subsets(vector<int>& nums) {
        //使用的方法为dfs，但是在更新答案的时候每一次dfs都能够储存一次答案，最后放数组遍历完毕的时候子集获取完毕
        ret.push_back(vector<int>());//储存特殊的答案。
        for(int i = 0;i<nums.size();i++)
        {
            dfs(nums,i);
        }
        return ret;
    }
};